#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/wait.h>

void assert(int flag,const char* str){
    if(flag<0){
        perror(str);
        exit(-1);
    }
}

int main(int argc,char* args[]){
    if(argc!=3) printf("参数必须为2,%d, \n",argc);
    int fd[2];
    int ret = pipe(fd);
    assert(ret,"pipe error");
    pid_t pid = fork();
    assert(pid,"fork error");
    if(pid>0){
        int fid = open(args[1],O_RDONLY);
        assert(fid,"open error");
        close(fd[0]);// 关闭读端；
        char buf[256];
        memset(buf,0x00,sizeof(buf));
        printf("读取开始\n");
        ssize_t ret;
        while((ret=read(fid,buf,sizeof(buf)))>0){
            if(ret<sizeof(buf)-1){
                buf[ret+1]=0x00;
            }
            write(fd[1],buf,ret);
        }
		// memset(buf,0x00,sizeof(buf));
		// write(fd[1],buf,sizeof(buf));
        //close(fd[1]);
        // int wstatus =-1;
        // int options = WNOHANG;
        // while (1)
        // {
        //     sleep(3);
        //     pid_t exit_pid = waitpid(-1,&wstatus,options);
        //     if(exit_pid>0){
        //         printf("子进程成功完成写文件,已被回收\n");
		// 		break;
        //     }else if(exit_pid==-1){
        //         printf("现在已经没有子进程了\n");
        //         break;
        //     }else{
        //         if(exit_pid==0&&options==WNOHANG){
        //             printf("当前需要回收的进程仍在运行,尚未退出\n");
        //         }
        //     }
        // }
        close(fd[1]);
        close(fid);
        int wstatus=-1;
        pid_t exit_id =waitpid(-1,&wstatus,WNOHANG);
        if(WIFEXITED(wstatus)){

        printf("结束执行\n");
        }else if(WIFSIGNALED(wstatus)){
            printf("异常产生\n");
        }else{
            printf("不明情况，%d",wstatus);
        }
        printf("无事发生");

        

        
    }else{
        int fid=open(args[2],O_WRONLY|O_CREAT);
        assert(fid,"open error");
        close(fd[1]); // 关闭写端；
        char buf[256];
        memset(buf,0x00,sizeof(buf));
        ssize_t ret;
        while((ret =read(fd[0],buf,sizeof(buf)))>0){
            write(fid,buf,ret);
        // printf("写入:%s",buf);
        }
        printf("写入完毕\n");
        close(fid);

    }// 子进程去获取一个输出文件；

}
